首页 > 试题广场 >

简单错误记录

[编程题]简单错误记录
  • 热度指数:339061 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。


处理:


1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是相同的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

数据范围:错误记录数量满足 ,每条记录长度满足

输入描述:

每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。



输出描述:

将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:

示例1

输入

D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645
E:\je\rzuwnjvnuz 633
C:\km\tgjwpb\gy\atl 637
F:\weioj\hadd\connsh\rwyfvzsopsuiqjnr 647
E:\ns\mfwj\wqkoki\eez 648
D:\cfmwafhhgeyawnool 649
E:\czt\opwip\osnll\c 637
G:\nt\f 633
F:\fop\ywzqaop 631
F:\yay\jc\ywzqaop 631
D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645

输出

rzuwnjvnuz 633 1
atl 637 1
rwyfvzsopsuiqjnr 647 1
eez 648 1
fmwafhhgeyawnool 649 1
c 637 1
f 633 1
ywzqaop 631 2

说明

由于D:\cfmwafhhgeyawnool 649的文件名长度超过了16个字符,达到了17,所以第一个字符'c'应该被忽略。
记录F:\fop\ywzqaop 631和F:\yay\jc\ywzqaop 631由于文件名和行号相同,因此被视为同一个错误记录,哪怕它们的路径是不同的。
由于循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准,所以D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645不会被记录。  
d = {}#初始化字典
while 1:#循环输入
    try:
        s = input().split("\\")[-1]#分割取最后一个元素
        s = s.split(" ")#将最后一个元素分割为一个列表
        s[0]=s[0][-16:]#取错误的后16位
        s = tuple(s)#列表不能作为字典的key,将列表转换为元组
        if s not in d:#加入字典
            d[s] = 1
        else:
            d[s] += 1
    except:
        break
last_d = list(d.keys())[-8:]#将字典的key变为列表取后八位
for i in last_d:#遍历列表last_d
    print("{} {} {}".format(i[0], i[1], d[i]))#格式化输出

编辑于 2024-03-06 14:08:13 回复(0)
#使用列表的形式记录
l=[]
ll=[]
while True:
    try:
        s=input().split('\\')
        s1=s[-1]
        s2=s1.split(' ')
        data=s2[0][-16:]+' '+s2[1]

        if data not in l:
            l.append(data)
            ll.append(1)
        else:
            ll[l.index(data)]+=1
    except:
        break
coder=l[-8:]
coder2=ll[-8:]
for i in range(len(coder)):
    print(coder[i],coder2[i])

#第二种方式,采用字典键值对的模式
l=[]
ll={}
while True:
    try:
        s=input().split('\\')
        s1=s[-1]
        s2=s1.split(' ')
        data=s2[0][-16:]+' '+s2[1]
        if data not in l:
            l.append(data)
            ll[data]=1  #字典中键为data的值赋值为1
        else:
            ll[data]+=1
    except:
        break
coder=l[-8:]  #将列表进行切片,然后根据字典中的键来获取键值对。
for item in coder:
    print(item,ll[item])

编辑于 2024-03-04 11:33:35 回复(0)
import sys

def main():
    map1 = {}
    # 双向队列,用于记录出入的顺序
    recoder = []
    for line in sys.stdin:
        a = line.split()
        list1 = a[0].split('\\')
        # 取后16位
        if len(list1[-1]) > 16:
            list1[-1] = list1[-1][-16:]
        fileName = list1[-1] +' '+ a[1]
        if fileName in map1:
            map1[fileName] += 1
        else:
            recoder.append(fileName)
            map1[fileName] = 1
        if len(recoder) > 8:
            remove = recoder.pop(0)
            map1[remove] = 0

    # 统计最后的8个结果:
    for item in recoder:
        print( item + ' '+ str(map1[item]))

if __name__ == '__main__':
     main()

发表于 2023-09-14 17:01:48 回复(0)
a\b\ccckkkkkkkkkkkkkkkk 456
a\b\uuukkkkkkkkkkkkkkkk 456
感觉像这种不因该算同一个(虽然说大于16的忽略)
发表于 2023-04-18 20:23:40 回复(0)
得注意审题
import sys
import json

def error_record():
    errors_line_dict_list = list()
    errors_count = dict()
    for line in sys.stdin:
        file_name, code_line = line.split()
        file_name = file_name.split('\\')[-1]
        if len(file_name) > 16:
            file_name = file_name[-16:]
        tmp_dic = {file_name: code_line}
        dump_tmp_dic = json.dumps(tmp_dic)
        if dump_tmp_dic not in errors_line_dict_list:
            errors_count[dump_tmp_dic] = 1
        else:
            errors_count[dump_tmp_dic] += 1
            continue
        errors_line_dict_list.append(dump_tmp_dic)
    if len(errors_line_dict_list) > 8:
        errors_line_dict_list = errors_line_dict_list[-8:]
    for dump_tmp_dic in errors_line_dict_list:
        tmp_dic = json.loads(dump_tmp_dic)
        file_name, line_num = list(tmp_dic.items())[0]
        print(f'{file_name} {line_num} {errors_count.get(dump_tmp_dic)}')


def main():
    error_record()

if __name__ == '__main__':
    main()

            





发表于 2023-02-14 15:59:59 回复(0)
import sys
wrong_dic={}
idx = 0
for line in sys.stdin:
    a = line.split("\\")
    wrong_title = a[-1].split(' ')[0][-16:]
    wrong_time = a[-1].split(' ')[-1]
    wrong = wrong_title+' '+wrong_time.strip()
    wrong_dic[wrong] = wrong_dic.get(wrong,[])+[idx]
key = list(wrong_dic.keys())[-8:]
for i in key:
    print(i,len(wrong_dic[i]))
发表于 2023-02-06 12:31:59 回复(0)
理清逻辑:不重复记录(作为字典元素里最好),重复需要计数,因此最初设置defaultdict(lambda: 1)重复加一就好。
只需要最后八条,因此把字典的元素放一个列表中,最后取[-8:]就好。
发表于 2022-09-14 20:58:00 回复(1)
import sys

def process_string(r_list):
    row = r_list[-1]
    record = r_list[0].split('\\')[-1]
    record = record[-16:]
    return [record, row]
    
err_list = []
    
for line in sys.stdin:
    a = line.split()
    err_list.append(process_string(a))

recorded_list = {}

for item in err_list:
    key_i = item[0]+'-'+item[1]
    if key_i not in recorded_list.keys():
        recorded_list[key_i] = 1
    else:
        recorded_list[key_i] += 1

key_l = list(recorded_list.keys())
if len(key_l) >= 8:
    for i in range(8):
        err = key_l[i-8].split('-')
        print(err[0], err[1], recorded_list[key_l[i-8]])
else:
    for i in range(len(key_l)):
        err = key_l[i].split('-')
        print(err[0], err[1], recorded_list[key_l[i]])
        

发表于 2022-09-13 17:32:23 回复(0)
import sys 
res=[]
for line in sys.stdin:
    line = line.strip().split('\\')
    ans=line[-1].split(' ')
    if len(ans[0])>16:
        res.append(ans[0][-16:]+' '+ans[1])
    else:
        res.append(ans[0]+' '+ans[1])
hash_table={}
for i in res:
    if i not in hash_table:
        hash_table[i]=1
    else:
        hash_table[i]+=1
if len(hash_table)>8:
    out=list(hash_table.items())
    for i in range(-8,0):
        print(out[i][0],out[i][1])
if len(hash_table)<=8:
    out=list(hash_table.items())
    for i in range(len(out)):
        print(out[i][0],out[i][1])

发表于 2022-09-02 17:48:40 回复(0)
题目写这么长,所以循环记录时什么意思?
发表于 2022-08-28 14:39:19 回复(0)
第一条645为啥没记
发表于 2022-08-19 14:44:58 回复(0)
a = []
aa = []
while True:
    try:
        b, c = input().split(' ')
        b = b.split('\\')[-1]
        if len(b) > 16:
            b = b[-16:]
        d = [b, c]
        if d not in a:
            a.append(d)
            aa.append(1)
        else:
            aa[a.index(d)] += 1
    except:
        break
for i in range(0 if len(a) <= 8 else len(a)-8, len(a)):
    print('{} {} {}'.format(a[i][0], a[i][1], aa[i]))

发表于 2022-08-18 16:01:57 回复(0)
err = []
while True:
    try:
        err.append(input())
    except:
        break 
from collections import Counter 
count = Counter()
for i in range(len(err)):
    name = err[i].split()[0].split('\\')[-1][-16:]
    num = err[i].split()[1]
    tmp = name+' '+num 
    count[tmp] += 1 

n = 0 
for i,j in count.items(): 
    if n >= len(count) - 8:
        print('{} {}'.format(i,j))
    n+=1

发表于 2022-08-18 11:13:39 回复(0)
这一题理解题目的意思比较重要,另外就是设计数据的结构,因为使用的是python语言,考虑使用字典来存储数据:
    使用 实际的错误记录(最后一个\后的最后16位 + ‘ ’ + 记录行数)作为键,出现的次数(计数)作为值,这样比较方便存储与修改。

rawstrs = []
mid_dict = dict()
output_lst = []
while True:
    try:
        mid_raw = input()
        str_all = mid_raw.split(' ')[0]
        str_num = mid_raw.split(' ')[1]
        if mid_raw not in rawstrs:
            rawstrs.append(mid_raw)
            key = str_all.split('\\')[-1][-16:] + ' ' + str_num
            if mid_dict.get(key, 'notfound') != 'notfound':
                mid_dict[key] += 1
            else:
                mid_dict[key] = 1
    except:
        break
mid_keys_lst = list(mid_dict.keys())[-8:]
for key, value in mid_dict.items():
    if key in mid_keys_lst:
        print('{} {}'.format(key,value))


发表于 2022-08-16 20:45:25 回复(0)
我觉得是题目有些问题。他这个循环记录在用例里根本没有出现。就是简单的哈希函数然后输出最后八个值。(其实如果根据题目的话还有很多细节他没有说,当然用例里也没有体现,比如后面的值出现,它的位置变不变呢?),这道题的体验不太好。
s = input().split('\\')
name,num= s[-1].split()
if len(name)>16:
    name = name[-16:]
first = name +' '+ num
dic = {}
dic[first] = dic.get(first,0) + 1
while True:
    try:
        l = input().split('\\')
        n,numb= l[-1].split()
        if len(n)>16:
            n = n[-16:]
        nall = n + ' ' + numb
#         if nall != first:
#         if nall in dic.keys():
        dic[nall] = dic.get(nall,0) + 1
#         else:
#             if first in dic.keys():
                
#                 if dic[first] == 2 and len(dic.keys())==1:
#                     break
#                 elif dic[first] == 1 and len(dic.keys())==1:
#                     dic[nall] = dic.get(nall,0) + 1
#                 else:
#                     break
#             else:
#                 break

            
                
    except:
        break
for key in list(dic.keys())[-8:]:
    print(key +' '+ str(dic[key]))

发表于 2022-08-10 10:42:16 回复(0)
一遍过~
发表于 2022-08-07 16:20:00 回复(1)
import sys
inputList = []
dic = {}
for line in sys.stdin:

    line = line.rstrip('\n').split('\\')[-1].split()
    name, error_line = line[0], line[1]
    if len(name) >= 16: 
        name = name[-16::]
    key = (name, error_line)
    
    if key not in dic:
        dic[key] = 1
    else:
        dic[key] += 1

for key in list(dic.keys())[-8::]:
    print(key[0] + ' ' + key[1] + ' ' + str(dic[key]))


发表于 2022-07-25 11:57:19 回复(0)
本来还想着用os.path.split()···但是好像用不了不知道为啥,老老实实手动split好了,循环记录那条要求太难懂了,试了半天才知道它的意思是:
如果下一条“处理完的”错误记录(只保留16位文件名+行号)不在滚动的8条里面,那就不再记录了,如果在就加1
import sys,re,os
f1 = []
for i in sys.stdin:
    f1.append(i)
dat1 = []
dat2 = []
d2 = {}    
for i in f1:
    fname = i.split('\\')[-1]
    fname = fname.split()[0][max(len(fname.split()[0])-16,0):]+' '+fname.split()[1]
    if fname in dat1 and fname not in dat2:
        continue
    dat1.append(fname)
    if fname in dat2:
        d2[fname]+=1
    else:
        if len(dat2)==8:
            d2.pop(dat2.pop(0))
        dat2.append(fname)
        d2[fname] = 1

for i in dat2:
    print(i+' '+str(d2[i]))


发表于 2022-06-25 11:55:25 回复(0)
import sys

records = {}
for line in sys.stdin:
    file_path, line_num = line.split(" ")
    file = file_path.split("\\")[-1]
    if len(file) > 16:
        file = file[-16:len(file)]
    rd = file + " " + line_num[:-1] # remove the '\n'
    if rd in records.keys():
        records[rd] += 1
    else:
        records.update({rd:1})
keys = list(records.keys())
last_8_keys = keys[-8:len(keys)]
for key in last_8_keys:
    print(key,records[key], sep=" ")
发表于 2022-06-11 18:41:06 回复(0)

问题信息

难度:
53条回答 66136浏览

热门推荐

通过挑战的用户

查看代码